package com.quectel.core.module.scheduling.dto;

import com.quectel.core.module.dept.dto.DeptPersonDto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
 * @author zhangheng
 * @email nolan.zhang@quectel.com
 * @date 2023/07/05 13:24
 */
@Data
@Schema
public class SchedulingLeaveConfigDto implements Serializable {

    /**
     * id
     */
    @Schema(description = "id")
    private Long id;

    /**
     * 租户id
     */
    @Schema(description = "租户id")
    private Long tenantId;

    /**
     * 小区id
     */
    @Schema(description = "小区id")
    private Long villageId;

    /**
     * 假期类型
     */
    @Schema(description = "假期类型")
    private Byte type;

    /**
     * 最小单位
     */
    @Schema(description = "最小单位,字典值:SchedulingLeaveTimeUnit")
    private Byte minUnit;

    /**
     * 1按工作日计算请假时长2按自然日计算请假时长
     */
    @Schema(description = "1按工作日计算请假时长2按自然日计算请假时长")
    private Byte calTimeLengthType;

    /**
     * 是否限额0不限额1限额(无需设置发放规则)
     */
    @Schema(description = "是否限额0不限额1限额(无需设置发放规则)")
    private Byte limitFlag;

    /**
     * 发放规则配置
     */
    @Schema(description = "发放规则配置")
    private String grantRuleJson;

    /**
     * 使用规则配置
     */
    @Schema(description = "使用规则配置")
    private String usageRuleJson;

    /**
     * 启用状态0未启用1已启用
     */
    @Schema(description = "启用状态0未启用1已启用")
    private Byte status;

    /**
     * 创建人
     */
    @Schema(description = "创建人")
    private String creator;

    /**
     * 创建时间
     */
    @Schema(description = "创建时间")
    private Date createTime;

    /**
     * 编辑人
     */
    @Schema(description = "编辑人")
    private String editor;

    /**
     * 编辑时间
     */
    @Schema(description = "编辑时间")
    private Date editTime;

    /************非数据库字段 start ************/

    /**
     * 类型名称
     */
    @Schema(description = "类型名称")
    private String typeName;

    /**
     * 编辑时间
     */
    @Schema(description = "发放规则")
    private GrantRule grantRule;

    /**
     * 使用规则
     */
    @Schema(description = "使用规则")
    private UsageRule usageRule;

    /**
     * 绑定人员
     */
    @Schema(description = "使用规则")
    private List<DeptPersonDto> personList;

    /**
     * 绑定人员数量
     */
    @Schema(description = "绑定人员数量")
    private Integer personCount;

    /**
     * 绑定人员数量
     */
    @Schema(description = "绑定人员数量")
    private String villageName;


    /************非数据库字段 end **************/

    @Data
    @Schema
    public static class GrantRule implements Serializable {
        /**
         * 发放方式 GrantMethodEnum
         */
        @Schema(description = "发放方式")
        private Byte method;

        /**
         * 发放时间周期类型 GrantPeriodTypeEnum
         */
        @Schema(description = "发放时间周期类型")
        private Byte periodType;

        /**
         * 发放时间
         * 可能为空字符串 如果是grantTImeType为按入职日期发放 则为空字符串
         */
        @Schema(description = "发放时间周期")
        private String period;

        /**
         * 新员工按日折算假期
         * 例如，员工全年有20天假期，当实际工作了31天时，可用的假期余额计算方式为31/365*20=1.7
         */
        @Schema(description = "新员工按日折算假期,例如，员工全年有20天假期，当实际工作了31天时，可用的假期余额计算方式为31/365*20=1.7")
        private Byte newEmployeeDiscount;

        /**
         * 发放标准
         */
        @Schema(description = "发放标准")
        private Byte grantStandard;

        /**
         * 发放标准
         */
        @Schema(description = "发放标准时间区间")
        private CombinedGrant combinedGrant;


        /**
         * 取整规则
         */
        @Schema(description = "取整规则")
        private Byte roundingRule;

        /**
         * 有效期类型
         */
        @Schema(description = "有效期类型")
        private Byte effectiveType;

        /**
         * 有效时长
         */
        @Schema(description = "有效时长")
        private Integer effectiveNum;

        /**
         * 有效时长单位
         */
        @Schema(description = "有效时长单位,字典值:SchedulingLeaveEffectiveTimeUnit")
        private Byte effectiveUnit;

        /**
         * 有效期扩展时长
         */
        @Schema(description = "有效期扩展时长")
        private Integer effectiveExtendNum;

        /**
         * 有效期扩展时长单位
         */
        @Schema(description = "有效期扩展时长单位,字典值:SchedulingLeaveEffectiveTimeUnit")
        private Byte effectiveExtendNumUnit;
    }

    @Data
    @Schema
    public static class CombinedGrant implements Serializable {
        @Schema(description = "固定发放数量")
        private Integer fixedAmount;
        @Schema(description = "总值限制,如果不为空则有最大值限制")
        private Integer totalLimit;
        @Schema(description = "司龄发放数量")
        private BreakpointsConfig companyResultConfig;
        @Schema(description = "工龄发放数量")
        private BreakpointsConfig workResultConfig;
    }


    @Data
    @Schema
    public static class BreakpointsConfig implements Serializable {
        @Schema(description = "区间")
        private List<Breakpoint> breakpoints;
        @Schema(description = "最大值")
        private Integer maxResult;
    }

    @Data
    @Schema
    public static class Breakpoint implements Serializable {
        @Schema(description = "门槛")
        private Integer threshold;
        @Schema(description = "达到门槛后的值")
        private Integer result;
    }


    @Data
    @Schema
    public static class UsageRule implements Serializable {
        /**
         * 是否需要证明材料 1需要0不需要
         */
        @Schema(description = "是否需要证明材料")
        private Byte evidenceFlag;

        /**
         * 证明材料文字提示
         */
        @Schema(description = "证明材料文字提示")
        private String evidenceRemark;

        /**
         * 是否限制单次最小时长
         */
        @Schema(description = "是否限制单次最小时长")
        private Byte singleMinTimeLimit;

        /**
         * 单次请假最小时长  ,单位和最小请假时长一致
         */
        @Schema(description = "单次请假最小时长,单位和最小请假时长一致")
        private TimeLimitConfig singleMinTime;

        /**
         * 是否限制单次最大时长
         */
        @Schema(description = "是否限制单次最大时长")
        private Byte singleMaxTimeLimit;

        /**
         * 单次请假最小时长 -1不限制 ,单位和最小请假时长一致
         */
        @Schema(description = "单次请假最大时长,单位和最小请假时长一致")
        private TimeLimitConfig singleMaxTime;

        /**
         * 是否限制累计最大时长
         */
        @Schema(description = "是否限制累计最大时长")
        private Byte accumulatedMaxTimeLengthLimit;

        @Schema(description = "累计请假最大时长,单位和最小请假时长一致")
        private List<TimeLimitConfig> accumulatedMaxTimeLength;

        @Schema(description = "提交申请时间限制,单位字典值:SchedulingLeaveTimeUnit")
        private Byte submitTimeLimitType;

        @Schema(description = "提交申请时间限制,单位字典值:SchedulingLeaveTimeUnit")
        private TimeLimitConfig submitTimeLimit;

        @Schema(description = "提交申请资格限制,单位字典值:SchedulingLeaveTimeUnit")
        private Byte qualificationLimitType;

        @Schema(description = "提交申请资格限制,单位字典值:SchedulingLeaveTimeUnit")
        private TimeLimitConfig qualificationLimit;

    }

    @Data
    @Schema
    public static class TimeLimitConfig implements Serializable {

        @Schema(description = "限制数量,包含")
        private BigDecimal num;

        @Schema(description = "单位,字典值:SchedulingLeaveTimeUnit")
        private Byte unit;

        @Schema(description = "周期单位,字典值:SchedulingLeaveEffectiveTimeUnit")
        private Byte periodUnit;
    }

}
